﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using PlanProd.Contracts.enums;
using PlanProd.Contracts.Misc;
using Web.Framework.Exceptions;
using PlanProd.Contracts.Validation;
using PlanProd.Contracts.Search;

namespace PlanProd.Contracts
{
    [ServiceContract]
    public interface IPlanProdAdmin
    {
        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        List<ProductoValidation> ValidarProductos(List<ProductoValidation> productosAValidar);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        List<Temporada> GetTemporadas(ServiceOptions serviceOptions, string nombre, int empresaId, DateTime? desde, DateTime? hasta, bool? activa);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        Temporada GetTemporadaById(ServiceOptions serviceOptions, int temporadaId);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        void EliminarTemporada(ServiceOptions serviceOptions, int temporadaId);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        Temporada SaveTemporada(ServiceOptions serviceOptions, Temporada temporada);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        List<CausaDesvio> GetCausasDesvios(ServiceOptions serviceOptions, int empresaId, string nombreLike);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        CausaDesvio GetCausaDeDesvioById(ServiceOptions serviceOptions, int causaDesvioId);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        CausaDesvio SaveCausaDesvio(ServiceOptions serviceOptions, CausaDesvio causaDesvio);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        void EliminarDesvioCausa(ServiceOptions serviceOptions, int causaDesvioId);                

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        List<Destino> GetDestinos(ServiceOptions serviceOptions, int empresaId, string nombreLike);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        Destino SaveDestino(ServiceOptions serviceOptions, Destino destino);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        Destino GetDestinoById(ServiceOptions serviceOptions, int destinoId);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        void EliminarDestino(ServiceOptions serviceOptions, int destinoId);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        List<Proveedor> GetProveedores(ServiceOptions serviceOptions, SearchProveedorCriteria criteria);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        List<PedidoComercial> GetPedidosComerciales(ServiceOptions serviceOptions, int? pedidoId, int? temporadaId, int? destinoId, DateTime? fechaDesde, DateTime? fechaHasta, string nombreLike);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        PedidoComercial GetPedidoComercialById(ServiceOptions serviceOptions, int id);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        void EliminarPedidoComercial(ServiceOptions serviceOptions, int pedidoComercialId);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        PedidoComercial SavePedidoComercial(ServiceOptions serviceOptions, PedidoComercial pedidoComercial);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        void UpdatePedidoComercialDetalle(ServiceOptions serviceOptions, List<PedidoComercialDetalle> pedidoComercialDetalleList);        

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        void EliminarPedidoComercialDetalle(ServiceOptions serviceOptions, int pedidoComercialDetalleId);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        void EliminarPedidoComercialDetalleAll(ServiceOptions serviceOptions, int pedidoComercialId);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        List<PresupuestoProduccion> GetPresupuestoProduccion(ServiceOptions serviceOptions, int? presupuestoId, int? temporadaId, int? destinoId, int? proveedorId, EstadoAprobado? estado, DateTime? fechaDesde, DateTime? fechaHasta);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        void EliminarPresupuestoProduccion(ServiceOptions serviceOptions, int presupuestoProduccionId);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        void AprobarPresupuestoProduccion(ServiceOptions serviceOptions, int presupuestoProduccionId, int empresaId, string userName, bool aprobado);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        void UpdatePresupuestoProduccionDetalle(ServiceOptions serviceOptions, List<PresupuestoProduccionDetalleProd> presupuestoProduccionDetalles);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        PresupuestoProduccion SavePresupuestoProduccion(ServiceOptions serviceOptions, PresupuestoProduccion presupuestoProduccion);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        PresupuestoProduccion GetPresupuestoProduccionById(ServiceOptions serviceOptions, int id);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        List<Producto> GetProductosForPresupuesto(ServiceOptions serviceOptions, string codigoProducto, string descripcionProducto, int presupuestoProduccionId);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        void UpdatePresupuestoProduccionItems(ServiceOptions serviceOptions, int presupuestoProduccionId, List<UpdateCantidadPlanProd> updates, List<int> deletedProductItems);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        List<PlanProduccion> GetPlanProduccion(ServiceOptions serviceOptions, int? planProduccionId, int? temporadaId, int? destinoId, int? proveedorId, DateTime? fechaDesde, DateTime? fechaHasta);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        void EliminarPlanProduccion(ServiceOptions serviceOptions, int planProduccionId);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        void UpdatePlanProduccionDetalle(ServiceOptions serviceOptions, List<PlanProduccionDetalleProd> planProduccionDetalles);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        PlanProduccion SavePlanProduccion(ServiceOptions serviceOptions, PlanProduccion planProduccion);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        PlanProduccion GetPlanProduccionById(ServiceOptions serviceOptions, int id, List<int> detalleIds);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        List<Producto> GetProductosForPlan(ServiceOptions serviceOptions, string filter, int planProduccionId);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        List<Producto> SearchProducts(ServiceOptions serviceOptions, SearchProductCriteria criteria);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        List<Producto> GetPossibleProductosForPlan(ServiceOptions serviceOptions, string filter, int planProduccionId);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        void UpdatePlanProduccionItems(ServiceOptions serviceOptions, int planProduccionId, List<UpdateCantidadPlanProd> updates, List<int> deletedProductItems);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        Desvio GetDesvioById(ServiceOptions serviceOptions, int desvioId);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        Desvio SaveDesvio(ServiceOptions serviceOptions, Desvio desvio);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        void EliminarDesvio(ServiceOptions serviceOptions, int desvioId);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        void AprobarDesvio(ServiceOptions serviceOptions, int desvioId, string userName, EstadoCharAprobado aprobado);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        Desvio GetDesvioByProductoDelPlanDeProduccion(ServiceOptions serviceOptions, int detalleProductoId);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        List<Desvio> GetDesvios(ServiceOptions serviceOptions, int? id, int? planProduccionId, string producto, string color, TipoDesvio? tipoDesvio, EstadoCharAprobado? estadoAprobado, int? causaDesvio, int? destinoId, int? temporadaId, int? proveedorId, DateTime? fechaDesde, DateTime? fechaHasta);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        List<Desvio> SaveDesvioMasivo(ServiceOptions serviceOptions, List<Desvio> desvios);

        [OperationContract]
        [FaultContract(typeof(WebFrameworkFaultException))]
        List<Desvio> SaveYAprobarDesvioMasivo(ServiceOptions serviceOptions, List<Desvio> desvios, string userName, EstadoCharAprobado aprobado);
    }
}
